//有时候在Go代码中可能会存在多个goroutine同时操作一个资源（临界区），这种情况会发生竞态问题（数据竞态）
// 除了使用channel实现同步之外，还可以使用Mutex互斥锁的方式实现同步

package main

import (
	"fmt"
	"sync"
	"time"
)

var m int = 100
var lock sync.Mutex
var wt sync.WaitGroup

func adsd() {
	defer wt.Done()
	lock.Lock()
	m += 1
	fmt.Printf("i++:%v\n", m)
	time.Sleep(time.Millisecond * 10) //等待，看结果清晰一点
	lock.Unlock()
}

func susb() {
	defer wt.Done()
	lock.Lock()
	time.Sleep(time.Millisecond * 4)
	m -= 1
	fmt.Printf("i--:%v\n", m)
	lock.Unlock()
}
func main() {
	for i := 0; i < 100; i++ {
		go adsd()
		wt.Add(1)
		go susb()
		wt.Add(1)
	}
	wt.Wait()
	fmt.Println(m)
}
